# -*- coding: utf-8 -*-

from django.db import models
from django.contrib.auth.models import User, Group, Permission

#from impressao import *
#from impressao import views

from unicodedata import normalize

# Create your models here.

class Telefone(models.Model):
    ddd = models.CharField(u'DDD', max_length=3, blank = True, null = True, default = '')
    numero = models.CharField(u'Número do Telefone', max_length=12)
    operadora = models.CharField(u'Operadora', max_length=20, blank=True, null=True, choices = (('Tim', 'Tim'), ('Claro', 'Claro'), ('Oi', 'Oi'), ('Vivo', 'Vivo'), ('Fixo', 'Fixo')))
    cliente = models.ForeignKey('Cliente')  

    def __unicode__(self):
        self.numero = '(' + self.ddd + ') ' + self.numero
        
        
        if self.operadora:
            return self.numero + ' - Op.: ' + self.operadora
        else:
            return self.numero
    
    def save(self, *args, **kwargs):
        import string
        for i in string.letters + string.punctuation + ' ':
            self.numero = self.numero.replace(i, '')
        
        super(Telefone, self).save(*args, **kwargs)

class Endereco(models.Model):
    rua = models.CharField(u'Rua', max_length=100, null=True, blank=True)
    cidade = models.CharField(u'Cidade', max_length=50, blank=True, null=True)
    referencia = models.CharField(u'Ponto de Referência', max_length=50, blank=True, null=True)
    cep = models.CharField(u'CEP', max_length=8, blank=True, null=True)
    cliente = models.ForeignKey('Cliente')

    def __unicode__(self):
        return self.rua + '. Ref.: ' + self.referencia + '. CEP: ' + self.cep + '. ' + self.cidade
    
    def save(self, *args, **kwargs):
        self.rua = normalize('NFKD', self.rua).encode('ASCII','ignore')
        self.cidade = normalize('NFKD', self.cidade).encode('ASCII','ignore')
        self.referencia = normalize('NFKD', self.referencia).encode('ASCII','ignore')
        super(Endereco, self).save(*args, **kwargs)

class Cartao_Credito(models.Model):
    class Meta:
        verbose_name = "Cartão de Crédito"
        verbose_name_plural = "Cartões de Crédito"
    nome = models.CharField(u'Nome no Cartão', max_length=30, blank=True, null=True)
    numero = models.CharField(u'Número do cartão de crédito', max_length=19, blank=True, null=True)
    codigo_seguranca = models.CharField(u'Código de Segurança', max_length=3, blank=True, null=True)
    operadora = models.CharField(u'Bandeira do Cartão', max_length=30, null=True, blank=True, choices = ( ('VISA', 'VISA'), ('Master Card', 'Master Card'), ('American Express','American Express'), ('Elo', 'Elo'), ('Hipercard', 'Hipercard') ) )
    data = models.CharField(u'Data de Validade', max_length=7, null=True, blank=True)
    cliente = models.ForeignKey('Cliente')
    
    def __unicode__(self):
        return self.nome + ' - ' + self.operadora

class Cliente(models.Model):
    nome = models.CharField(u'Nome do Cliente', max_length=50)
    cpf = models.CharField(u'CPF', max_length=11, blank=True, null=True)

    def __unicode__(self):
        return self.nome
    
    def save(self, *args, **kwargs):
        self.nome = normalize('NFKD', self.nome).encode('ASCII','ignore')
        super(Cliente, self).save(*args, **kwargs)

class Mesa(models.Model):
    nome = models.CharField(u'Nome da Mesa', max_length=20)
    tipo = models.IntegerField(u'Tipo de Mesa', choices = ( (1, 'Local'), (2, 'Entrega'), (3, 'balcão') ), default = 1)

    def __unicode__(self):
        return self.nome

class Pedido(models.Model):
    mesa = models.ForeignKey(Mesa, null=True, blank=True)
    numero_pessoas = models.IntegerField(null=True, blank=True, default=0)
    total = models.DecimalField(u'Preço Total', max_digits=10, decimal_places=2)
    aberto = models.IntegerField(choices=((0,'Não'), (1, 'Sim')))
    data_aberto = models.DateTimeField(u'Data de abertura')
    data_fechado = models.DateTimeField(u'Data de Fechamento', null=True)
    desconto = models.CharField(u'Desconto', null=False, blank=True, max_length=10)
    #Quem abre o pedido (ex. garçon)
    usuario = models.ForeignKey(User, null=True, blank=True)
    #Cliente do estabelecimento
    cliente = models.ForeignKey('Cliente', null=True, blank=True)
    
    def save(self, *args, **kwargs):
        self.desconto = str(self.desconto).strip()
        if self.desconto != '':
            permitidos = '0123456789,.% '
            desconto = self.desconto.strip()
            
            descontovalido = True
            for i in range(len(desconto)):
                if permitidos.find(desconto[i]) == -1:
                    request.session['aviso'] = 'Desconto inválido!'
                    self.desconto = ''

                    descontovalido = False
                    break

            pagamento_parcial = Pagamento_parcial.objects.filter(pedido_id = self.id)
            valor_pago = 0.0
            for pagamento in pagamento_parcial:
                valor_pago += float(pagamento.valor)

            if descontovalido:
                desconto = desconto.replace(',', '.')
                desconto = desconto.replace(' ', '')
                if desconto.count('.') > 1:
                    desconto = desconto.replace('.', '', desconto.count('.') -1)

                ultimo = desconto[len(desconto)-1]
                if ultimo == '%':
                    desconto = float(desconto.replace('%', ''))
                    desconto = float(self.total) * desconto / 100
    
                desconto = float(desconto)
                
                self.desconto = round(desconto, 3)
                
                print desconto
                print self.desconto
                if round(desconto, 3) > round(float(self.total) - valor_pago, 3):
                    self.desconto = ''
        
        super(Pedido, self).save(*args, **kwargs)
    
    def __unicode__(self):
        return 'Pedido %s' % str(self.id)

class Categoria(models.Model):
    nome_categoria = models.CharField(u'categoria do Produto', max_length=50, unique=True)
    descricao = models.TextField('Descrição', blank=True, null=True)
    
    def save(self, *args, **kwargs):
        self.nome_categoria = self.nome_categoria.replace(' ', '_')
        self.nome_categoria = self.nome_categoria.replace('-', '_')
        
        super(Categoria, self).save(*args, **kwargs)
    
    def __unicode__(self):
        return self.nome_categoria

class Setor(models.Model):
    """
    Define onde é dipachado o produto
    notificar = 0; Não precisa gerar notificação
    notificar = 1;
    """
    class Meta:
        verbose_name_plural = "Setores"
        
    nome_setor = models.CharField(u'Nome do Setor', max_length=50, unique=True)
    notificar = models.IntegerField(default = 0, choices = ((1, 'Sim'), (0, 'Não')))
    destino = models.ForeignKey('impressao.Impressora', null = True, blank = True, default = None)
    
    def __unicode__(self):
        return self.nome_setor

class Produto(models.Model):
    descricao = models.CharField(u'Descrição',max_length=50)
    descricao_impressao = models.CharField(u'Descrição para impressão', max_length=30)
    preco_de_venda = models.DecimalField(u'Preço de Venda', max_digits=10, decimal_places=2)
    codigo = models.CharField(u'Código', max_length=50, unique=True)
    quantidade = models.BigIntegerField('Quantidade em Estoque')
    preco_de_compra = models.DecimalField(u'Preço de Compra',blank=True, null=True, max_digits=15, decimal_places=2)
    observacao = models.TextField('Observação', blank=True, null=True)
    imagem = models.ImageField(null=True, blank=True, upload_to='galeria')
    categoria = models.ForeignKey(Categoria)
    setor = models.ForeignKey(Setor)
    elemento = models.ManyToManyField(Pedido, through='Item')
    
    def save(self, *args, **kwargs):
        self.descricao_impressao = normalize('NFKD', self.descricao_impressao).encode('ASCII','ignore')
        super(Produto, self).save(*args, **kwargs)

    def __unicode__(self):
        return self.descricao

class Item(models.Model):
    """
    estado = 0; Produto excluido da lista
    estado = 1; Produto existe
    estado = 2; Produto existe e foi pedido(processado)
    estado = 3; Produto não será cobrado
    """
    class Meta:
        verbose_name_plural = "Itens"

    pedido = models.ForeignKey(Pedido)
    produto = models.ForeignKey(Produto)
    quantidade = models.IntegerField()
    estado = models.IntegerField(default=1, choices = ((0, 'Item excluído da lista'), (1, 'Item está na lista'), (2, 'Item processado'), (3, 'Grátis')))
    usuario = models.ForeignKey(User, null=True, blank=True)
    data = models.DateTimeField(u'Horário do pedido')
    observacao = models.TextField('Observação', blank=True, null=True, default = '')

    def __unicode__(self):
        return self.produto.descricao

class Dia_funcionamento(models.Model):
    class Meta:
        verbose_name_plural = "Dias de Funcionamento"
    aberto = models.DateTimeField()
    fechado = models.DateTimeField(null=True, blank=True)
    evento = models.TextField(max_length=50, null=True, blank=True)
    
    def save(self, *args, **kwargs):
        self.evento = normalize('NFKD', self.evento).encode('ASCII','ignore')
        super(Dia_funcionamento, self).save(*args, **kwargs)
    
    def __unicode__(self):
        if str(self.evento).strip() != '':
            return self.evento
        else:
            return str(self.aberto.strftime('%d/%m/%Y - %H:%M'))

class Evento(models.Model):
    usuario = models.ForeignKey(User, null=True, blank=True)
    data = models.DateTimeField()
    pedido = models.ForeignKey(Pedido, null=True, blank=True)
    descricao = models.TextField()

    def __unicode__(self):
        # return "Evento " + str(self.id)
        if self.pedido != None:
            return unicode(self.data.strftime('%d/%m/%Y - %H:%M')) + ' - ' + self.usuario.username + ', ' + unicode(self.pedido.mesa) + ' - ' + self.descricao
        else:
            return unicode(self.data.strftime('%d/%m/%Y - %H:%M')) + ' - ' + self.usuario.username + ' - ' + self.descricao

class Pagamento_parcial(models.Model):
    pedido = models.ForeignKey(Pedido)
    valor = models.DecimalField(u'Valor', max_digits=10, decimal_places=2)
    data = models.DateTimeField(u'Data do pagamento')
    
    
